/**
 * CLASSE ListagemProcessos
 *
 * Esta classe contem a implementacao do acesso ao arquivo CSV de processos e a implementacao das
 * operacoes de consulta e insercao no cadastro de processos. Enfim, todas as operacoes relativas
 * ao conjunto de processos do sistema estao implementadas aqui. 
 */

//-------------------------------------------------------------------
// I M P O R T A C A O   D E   C L A S S E S   D A   A P I   J A V A
//-------------------------------------------------------------------

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Vector;

/**
 * Inicio da especificacao da classe.
 */
public class ListagemProcessos {

//------------------------------------------------------
// M E T O D O S
//------------------------------------------------------

	/**
	 * METODO incluirProcesso
	 *		Adiciona um novo registro de processo ao cadastro. Os dados desse processo devem ser passados ao
	 * metodo dentro de um objeto da classe Processo. 
	 */
	public void incluirProcesso(Processo p) {
		try {
		
			FileWriter fw = new FileWriter("processos.csv", true);
			BufferedWriter arq = new BufferedWriter(fw);
			
			arq.write(p.codCliente + ";" +
					  p.numero + ";" +
				      p.descricao);
			arq.newLine();
			
			arq.close();
			
		} catch(IOException e) {
			System.out.println("Erro ao tentar gravar as linhas do arquivo \"processos.csv\".");
		} 
	} // Fim do metodo "incluirProcesso".
	
	/**
	 * METODO analisaLinha
	 *		Cria um objeto da classe Processo contendo os dados do processo contidos em uma linha do arquivo
	 * CSV de processos, passada no parametro como um String.
	 */
	public Processo analisaLinha(String linha) {
		String[] dados = linha.split(";");
		Processo p = new Processo();
		p.codCliente = Integer.parseInt(dados[0].trim());
		p.numero = Integer.parseInt(dados[1].trim());
		p.descricao = dados[2].trim();
		return p;
	} // Fim do metodo "analisaLinha"
	
	/**
	 * METODO consultaPorNumero
	 *		Retorna os dados do processo identificado pelo numero passado no parametro. Os dados do
	 * processo encontrado serao retornados dentro de um objeto da classe Processo. Caso nao seja 
	 * encontrado um processo com o numero informado, o metodo retorna null.
	 */
	public Processo consultaPorNumero(int numero) {
		try {
			FileReader fr = new FileReader("processos.csv");
			BufferedReader arq = new BufferedReader(fr);
			
			String linha = arq.readLine();
			while(linha != null) {
				if(linha.trim().length() > 0) {
					Processo p = analisaLinha(linha);
					if(p.numero == numero) {
						arq.close();
						return p;
					}
				}
				linha = arq.readLine();
			}
			arq.close();
			
		} catch(FileNotFoundException e) {
			System.out.println("O arquivo de processos (\"processos.csv\") nao foi encontrado!");
		} catch(IOException e) {
			System.out.println("Erro ao tentar ler as linhas do arquivo \"processos.csv\".");
		} // Fim da estrutura try...catch iniciada na linha 74.
		
		return null;
		
	} // Fim do metodo "consultaPorNumero".
	
	/**
	 * METODO consultaPorCliente
	 *		Retorna todos os processos de um determinado cliente, dentro de um vetor de objetos da classe Processo.
	 */
	public Processo[] consultaPorCliente(int codCliente) {
		Vector<Processo> result = new Vector<Processo>();
		try {
			FileReader fr = new FileReader("processos.csv");
			BufferedReader arq = new BufferedReader(fr);
			
			String linha = arq.readLine();
			while(linha != null) {
				if(linha.trim().length() > 0) {
					Processo p = analisaLinha(linha);
					if(p.codCliente == codCliente) {
						result.add(p);
					}
				}
				linha = arq.readLine();
			}
			arq.close();
			
		} catch(FileNotFoundException e) {
			System.out.println("O arquivo de processos (\"processos.csv\") nao foi encontrado!");
		} catch(IOException e) {
			System.out.println("Erro ao tentar ler as linhas do arquivo \"processos.csv\".");
		} // Fim da estrutura try...catch iniciada na linha 107.
		
		return result.toArray(new Processo[0]);
	} // Fim do metodo "consultaPorCliente".
	
} // Fim da classe "ListagemProcessos".